acme.sh 简介
acme.sh 是一个实现了 ACME(Automatic Certificate Management Environment)协议的开源客户端工具,用于自动申请、续签和部署 SSL/TLS 证书。它支持 Let's Encrypt 等 CA 机构,是目前最流行的免费 SSL 证书管理工具。
Let's Encrypt 证书有效期 90 天,acme.sh 会自动设置 cron 任务在到期前续签。
安装 acme.sh
# 安装
curl https://get.acme.sh | sh -s email=your-email@example.com
# 安装完成后会自动添加 cron 任务
# 查看cron
crontab -l
bash
安装完成后,acme.sh 会被安装到 ~/.acme.sh/ 目录,并自动创建 cron 定时任务。
申请证书
acme.sh 支持多种验证方式:
HTTP 验证(最常用)
# 使用 webroot 方式验证域名所有权
acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html
bash
原理:acme.sh 在网站根目录下放置一个验证文件,Let's Encrypt 通过 HTTP 访问这个文件来确认你拥有该域名的控制权。
DNS 验证
# 使用 DNS API 自动验证(以 Cloudflare 为例)
export CF_Key="your-api-key"
export CF_Email="your-email@example.com"
acme.sh --issue -d example.com --dns dns_cf
bash
DNS 验证不需要网站运行,适合申请通配符证书(*.example.com)。
standalone 模式
# acme.sh 自己启动一个临时 Web 服务器
# 需要 80 端口未被占用
acme.sh --issue -d example.com --standalone
bash
安装证书到 Nginx
# 将证书安装到指定目录(不要直接使用 ~/.acme.sh/ 中的文件)
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com/key.pem \
--fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
bash
--reloadcmd 指定证书更新后自动重载 Nginx 配置。acme.sh 会记住这些路径和命令,续签时自动执行。
证书续签
# 手动续签
acme.sh --renew -d example.com
# 强制续签(不管是否到期)
acme.sh --renew -d example.com --force
bash
acme.sh 安装时已自动添加 cron 任务,默认每天检查一次证书有效期,到期前 30 天自动续签。
自动化脚本集成
将证书管理集成到部署脚本中:
#!/bin/bash
# deploy-ssl.sh
DOMAIN="example.com"
SSL_DIR="/etc/nginx/ssl/$DOMAIN"
# 创建证书目录
mkdir -p "$SSL_DIR"
# 申请或续签证书
~/.acme.sh/acme.sh --issue -d "$DOMAIN" --webroot /var/www/html
# 安装证书
~/.acme.sh/acme.sh --install-cert -d "$DOMAIN" \
--key-file "$SSL_DIR/key.pem" \
--fullchain-file "$SSL_DIR/fullchain.pem" \
--reloadcmd "systemctl reload nginx"
echo "SSL证书已更新: $DOMAIN"
bash
查看已申请的证书
# 列出所有证书
acme.sh --list
# 查看特定证书信息
acme.sh --info -d example.com
bash
常见问题
- 80 端口被占用:使用 DNS 验证或 standalone 模式前停止 Nginx
- 验证失败:检查域名 DNS 是否正确指向服务器、防火墙是否开放 80 端口
- 续签失败:检查 webroot 路径是否正确、网站是否正常运行
- 证书目录权限:Nginx 需要读取权限,通常设置为
chmod 644
↑